#include "Reactor.hpp"
#include "Sock.hpp"
#include "Accepter.hpp"
#include "Util.hpp"

static void Usage(std::string proc){
    std::cout << "Usage: " << proc << " port" << std::endl;
}

int main(int argc, char *argv[]){
    if(argc != 2){
        Usage(argv[0]);
        exit(1);
    }
    //1. 创建socket，监听
    int listen_sock = Sock::Socket();
    SetNonBlock(listen_sock);
    Sock::Bind(listen_sock, (uint16_t)atoi(argv[1]));
    Sock::Listen(listen_sock);

    // 2. 创建Reactor对象
    // Reactor 反应堆模式: 通过多路转接方案，被动的采用事件派发的方式，去反向的调用对应的回调函数
    Reactor *R = new Reactor();
    R->InitReactor();

    //3. 给Reactor反应堆中加柴火
    //3.1 有柴火
    Event *evp = new Event;
    evp->sock = listen_sock;
    evp->R = R;

    //Accepter: 链接管理器
    evp->RegisterCallback(Accepter, nullptr, nullptr);
    //3.2 将准备好的柴火放入反应堆Reactor中
    R->InsertEvent(evp, EPOLLIN|EPOLLET);

    //4. 开始进行事件派发！
    int timeout = 1000;
    for( ; ; ){
        R->Dispatcher(timeout);
    }
}